秒間15,000件のデータを Kinesis Data Streams のオンデマンドモードで処理してみました #reinvent
1 はじめに
IoT事業部の平内(SIN)です。
AWS re:Invent 2021、Serverless and on-demand analytics として発表された Kinesis Data Streams のオンデマンドモードでは、書き込み 200 MiB/秒、200,000 レコード/秒、読み取り 400 MiB/秒まで、シャード数の設定なしで利用できます。
このアップデートについては、既に、ここDeveloppers IOでも詳しく紹介されています。
そして、下記の記事でスケールの状況が、紹介されていました。
Amazon Kinesis Data Streams On-Demand – Stream Data at Scale Without Managing Capacity
- 新規にオンデマンドモードで作成すると4MB/s、4,000rpsとなる
- 200MB/s 200,000rpsまで自動でスケールする
- 過去30日間のピーク書き込みスループットの最大2倍に対応
- 数分でスケールする(下図)
https://aws.amazon.com/jp/blogs/aws/amazon-kinesis-data-streams-on-demand-stream-data-at-scale-without-managing-capacity/
本記事は、このオンデマンドモードで、ストリームがスケールする様子を、「少しでも体感してみたい」ということで、手元で試してみた記録です。
2 構成
動作確認のために用意した構成は、以下の通りです。
EC2上で、MQTTのpublishを行うプログラムを動作させ、AWS IoTのルールでKinesis Data Streamsに流しています。 後段のLambdaは、到着したレコード数をログ出力するようになっています。
基本的なトラフィックは、下記のようなものを設定してみました。通常100rpsで、たまに15,000rpsまでバーストするイメージです。
- 0〜 9秒 100/rps
- 10〜19秒 15,000/rps
- 20〜29秒 100/rps
参考:大量のMQTTを送信するプログラムは、下記のものをベースに準備しました。
3 プロビジョニングモード(シャード数 16)
最初に、構成の確認です。
バースト時のデータ数が 15,000/rpsなので、一旦、シャード数に16に設定し、全てのレコードが、遅延(エラー)なく処理できている状況を確認しています。
図は、左から下記を集計しています。
- メッセージブローカーにPublishされた、レコード数(秒)
- ルールでKinesisへの転送に成功したレコード数(秒)
- ルールでKinesisへの転送に失敗したレコード数(秒)
- Lambdaで処理したレコード数(秒)
送信したデータ数が、毎秒、正確にPublish-Inにカウントされ、ほぼ遅延なく、全てルール処理され(エラーなし)、同数が、Lambdaで処理したレコード数となって出力されています。
4 オンデマンドモード
続いて、上記のシャード数を一旦、1まで変更した後、オンデマンドに設定しました。
確認してみると、100rpsでは問題ありませんが、15,000rpsになった途端、ルール転送で大量のエラーが発生してLambdaまでレコードが到着していない状況が確認できます。
5 ピーク 2000rps / 2500rps
どれぐらいのデータ数まで対応可能なのかという意味で、バーストのデータ数を変更してみました。
- バーストを2,000rpとすると処理可能(上図)
- バーストを2,500rpsとすると、少しエラーが発生(下図)
オンデマンドで新規に作成したストリームは、デフォルトで4,000/secまで対応可能なはずですが、今回は、シャード数を一旦、1にプロビジョニングしたストリームをオンデマンドに変更したので、それが影響しているかも知れません。
6 スケール
ストリームがスケールするように、少し、2,500rpsを流してみました。 当初、エラーが大量に発生してました(上図)が、数分するとエラーは出なくなりました(下図)。
これが自動的なスケールなのですね。
今度は、5,000rpsで試してみました。こちらも、最初エラーが発生してました(上図)が、同様に数分後エラーは出なくなりました(下図)。
思い切って、15,000rpsで試してみました。こちらも数分でスケールできたようです。
7 最終確認
最初の要件に戻って、下記のトラフィックを流してみたところ、今度は、まったく問題なく処理できました。
- 0〜 9秒 100/rps
- 10〜19秒 15,000/rps
- 20〜29秒 100/rps
- Publish-In
- Lambdaで処理したレコード数
グラフで見ても、Publishで到着したデータが、ほぼ遅延なく処理できているようです。
8 最後に
ほんの少しですが、Kinesis Data Streamsのオンデマンドのスケールアウトを体感できた気がしました。
トラフィックが増大しても、自動的にスケールしてくれるは、非常に強力であり、要件が、オンデマンドモードの最大値に収まるのであれば、是非採用したいところですが、今回見たように、急なトラフィック増加では、スケールするまで数分は、処理が追いつかない場合がある事に考慮が必要そうです。
また、「過去30日間のピーク書き込みスループットの最大2倍に対応」となっており、スケールインもするはずなので、その点も注意が必要だと思います。